package main

import(
	"fmt"
)

func main()  {   //主函数
	//定义数组
	// arr := [5] int {1,3,6,4,7}
	// //定义切片
	// //定义一个切片名字为slice，这个切片是引用arr数组里下标1到下标3的数据，不包含下标3 ------------[1,3]
	// slice := arr [1:3]
	// fmt.Println(slice)
	// //获取切片长度
	// fmt.Println(cap(slice))
	// fmt.Println(&slice[0])
	// fmt.Println(&arr[1])
	// //修改切片的值：这个切片引用的数组的对应的值也会被修改
	// slice[0] = 66
	// fmt.Println("slice:",slice)
	// fmt.Println("arr:",arr)
	
	
	//定义切片的三种方式
	//方式一：
	// arr := [5]int{1,3,6,4,7}
	// slice1 := arr[1:3]
	// fmt.Println(slice1)
	// //打印切片的类型    []int
	// fmt.Printf("%T \n",slice1)
	

	// //方式二：通过make函数创建切片，make函数传入三个参数：1，切片的类型 2，切片长度 3，切片内容（可以省略）
	// //make函数会在底层创建一个数组，但是这个数组对外不可见，通过make函数创建的切片会引用这个数组
	// slice2 := make([]int,4)
	// fmt.Println("slice2的长度：",len(slice2))
	// fmt.Println("slice2的容量：",cap(slice2))
	// fmt.Println(slice2)
	// //赋值
	// slice2[0] = 66
	// slice2[1] = 88
	// fmt.Println(slice2)

	// //方式三；
	// slice3 := []int{1,3,5,6}
	// //区分：[]里有数字的是定义数组
	// //arr := [4]int{1,3,5,6}
	// fmt.Println(slice3)


	// //作业:遍历切片
	// //方式一：for
	// for i := 0 ; i <len(slice3) ; i++{
	// 	fmt.Print("\n 切片的值为： ",slice3[i])
	// }
	// fmt.Println()
	// fmt.Println("----------------------")

	// //方式二：for range

	// for _,value := range slice3 {
	// 	fmt.Print("\n 切片的值为： ",value)
	// }





	//切片可以继续切片
	arr :=[5]int{1,3,5,6,7}
	slice1 := arr[1,5]
	fmt.Println("slice1:",slice1)
	slice2 := slice1[1,3]
	fmt.Println("slice2:",slice2)
	slice2[0] = 66
	fmt.Println("slice2修改后：",slice2)
	fmt.Println("arr:",arr)

	//切片可以动态增长
	arr := [5]int{1,3,5,6,7}
	slice1 := arr[1:3]
	fmt.Println("追加前slice1:",slice1)
	fmt.Println("追加前arr:",arr)
	fmt.Println("slice1的容量："，cap(slice1))
	//情况一.当追加元素后切片的长度不超过当前的容量，会在原本数组上追加
	//slice1 = append(slice1,66,88)   //往slice1后面追加66和88
	fmt.Println("追加后slice1：",slice1)
	fmt.Println("追加后arr:",arr)

	//情况二：当追加元素后切片的长度超过了当前的容量，那么append函数将会执以下步骤:
	//1.分配新数组；append函数会创建一个新的更大数组，新数组的大小通常是原数组大小的两倍左右
	//2.赋值旧数组内容：将旧数组的所有元素复制到新数组中
	//3.追加新元素：在新数组的末尾追加新元素
	//4.更新切片引用：将切片的底层指针指向这个新数组，并更新切片的长度和容量
	slice1 = append(slice1,66,88,77)  //往slice1后面追加66和88
	fmt.Println("追加后slice1：",slice1)
	fmt.Println("------------------------------")

	//将切片追加给切片
	arr1 := [5]int{1,3,5,6,7}
	slice3 := arr1[1:3]
	slice2 := []int{66,77,88}
	fmt.Println("追加后slice3：",slice3)
	slice3 = append(slice3,slice2...)   //将slice2追加到slice3后面 ， ...表示追加的是一个切片
	fmt.Println("追加后slice3：",slice3)
	fmt.Println("------------------------------")
	//切片的拷贝
	a := []int {1,3,5,6}
	b := make([]int,10,20)
	fmt.Println("拷贝前a：",a)
	fmt.Println("拷贝前b：",b)
	//拷贝：
	copy(b,a)      //将a中对应数组中元素内容复制到b中对应的数组中
	fmt.Println("拷贝后b："，b)







}